package org.yelongframework.core.resource.freemarker;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections4.CollectionUtils;

/**
 * 抽象实现
 * 
 * @since 1.0.0
 */
public abstract class AbstractTemplateResourceHandler implements TemplateResourceHandler {

	/** 默认下一次处理是否加工参数 */
	protected static final boolean DEFAULT_NEXT_HANDLE_WHETHER_PROCESS_PARAM = true;

	/** 模板参数加工者集合 */
	protected List<TemplateParameterProcessor> templateParameterProcessors = new ArrayList<>();

	/** 下一次处理是否加工参数线程变量 */
	protected final ThreadLocal<Boolean> nextHandleWhetherProcessParamThreadLocal = new ThreadLocal<>();

	// ==================================================构造器==================================================

	public AbstractTemplateResourceHandler() {
	}

	// ==================================================是否加工参数==================================================

	@Override
	public boolean isNextHandleWhetherProcessParam() {
		Boolean value = nextHandleWhetherProcessParamThreadLocal.get();
		return value == null ? true : value;
	}

	@Override
	public void setNextHandleWhetherProcessParam(boolean whether) {
		nextHandleWhetherProcessParamThreadLocal.set(whether);
	}

	// ==================================================加工模板参数==================================================

	@Override
	public Map<String, Object> processTemplateParameter(Map<String, Object> params) {
		if (CollectionUtils.isEmpty(templateParameterProcessors)) {
			throw new NullPointerException("不存在模板参数加工器");
		}
		for (TemplateParameterProcessor templateParameterProcessor : templateParameterProcessors) {
			params = templateParameterProcessor.apply(params);
		}
		return params;
	}

	// ==================================================模板参数加工器==================================================

	@Override
	public void addTemplateParameterProcessor(TemplateParameterProcessor templateParameterProcessor) {
		templateParameterProcessors.add(templateParameterProcessor);
	}

	@Override
	public void addTemplateParameterProcessors(List<TemplateParameterProcessor> templateParameterProcessors) {
		templateParameterProcessors.addAll(templateParameterProcessors);
	}

	@Override
	public List<TemplateParameterProcessor> getTemplateParameterProcessors() {
		return templateParameterProcessors;
	}

	@Override
	public void removeTemplateParameterProcessor(TemplateParameterProcessor templateParameterProcessor) {
		templateParameterProcessors.remove(templateParameterProcessor);
	}

}
